package com.hspedu.reflection;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @Author Stringzhua
 * @Date 2024/4/28 21:38
 * description:
 */
public class Reflection01 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, NoSuchFieldException {
        //1.使用Properties类读写配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("chapter22\\src\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString();
        String methodName = properties.get("method").toString();


        //3.使用反射机制解决
        //(1)加载一个class类,返回一个Class类型的对象
        Class cls = Class.forName(classfullpath);
        //(2)通过cls,得到要加载的类com.hsp.Cat的对象实例
        Object o = cls.newInstance();
        System.out.println("o的运行类型是" + o.getClass());//运行类型
        //(3)通过cls 得到加载的类 com.hspedu.Cat的methodName "hi" 的方法对象
        // 即,在反射中,可以把方法视为对象(万物皆对象)
        Method method1 = cls.getMethod(methodName);
        //(4)通过method1调用方法,即通过方法对象来实现调用方法
        System.out.println("===========================");
        method1.invoke(o);//传统方法是对象.方法() , 反射机制中是 方法.invoke(对象)


        //java.lang.reflect.Field:代表类的成员变量,Field对象表示整个类的成员变量
        //得到name字段
        //getField不能得到私有的属性
        Field nameField = cls.getField("age");
        System.out.println(nameField.get(o));//传统写法,对象.成员变量, 反射:成员变量对象.get(对象)

        //java.lang.reflect.Constructor:代表类的构造方法,Constructor对象表示构造器
        Constructor constructor = cls.getConstructor();//()中可以指定构造器参数类型,返回的是无参构造器public com.hspedu.Cat()
        System.out.println(constructor);//Cat()

        Constructor constructor2 = cls.getConstructor(String.class);//这里传入的是String.class 就是String类的class对象 public com.hspedu.Cat(java.lang.String) 有形参的构造器
        System.out.println(constructor2);//Cat(String name)
    }
}
